// Ling.cpp : main source file for Ling.exe
//

#include "Precompiled.hpp"

#include <atlframe.h>
#include <atlctrls.h>
#include <atldlgs.h>

#include "resource.h"

#include "aboutdlg.h"

#include <gdiplus.h>
using namespace Gdiplus;
#pragma comment(lib, "gdiplus.lib")

#include <vfw.h>
#pragma comment(lib, "vfw32.lib")
#include "Player.h"
#include "PlayerState.h"
#include "MainWindow.h"

CAppModule _Module;

int Run(LPTSTR /*lpstrCmdLine*/ = NULL, int nCmdShow = SW_SHOWDEFAULT)
{
    CMessageLoop theLoop;
    _Module.AddMessageLoop(&theLoop);

    MainWindow wndMain;

    //if(wndMain.CreateEx() == NULL)
    //{
    //	ATLTRACE(_T("Main window creation failed!\n"));
    //	return 0;
    //}

    wndMain.ShowWindow(nCmdShow);

    int nRet = theLoop.Run();

    _Module.RemoveMessageLoop();
    return nRet;
}

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPTSTR lpstrCmdLine, int nCmdShow)
{
#if defined(DEBUG)
    AllocConsole(); 
    freopen("CONOUT$", "w+t", stdout);
    freopen("CONOUT$", "w+t", stderr);
    std::cout << "WinMain is started" << std::endl;
#endif
    
    HRESULT hRes = ::CoInitialize(NULL);
// If you are running on NT 4.0 or higher you can use the following call instead to 
// make the EXE free threaded. This means that calls come in on a random RPC thread.
//  HRESULT hRes = ::CoInitializeEx(NULL, COINIT_MULTITHREADED);
    ATLASSERT(SUCCEEDED(hRes));
    //Startup Gdi plus
    GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR           gdiplusToken; 
    Gdiplus::Status st = GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
        
    // this resolves ATL window thunking problem when Microsoft Layer for Unicode (MSLU) is used
    ::DefWindowProc(NULL, 0, 0, 0L);

    AtlInitCommonControls(ICC_BAR_CLASSES);	// add flags to support other controls

    hRes = _Module.Init(NULL, hInstance);
    ATLASSERT(SUCCEEDED(hRes));

    int nRet = Run(lpstrCmdLine, nCmdShow);

    _Module.Term();
    ::CoUninitialize();

    GdiplusShutdown(gdiplusToken);
    return nRet;
}
